/*package com.ainote.controller;

import com.ainote.service.AsrService;
import com.ainote.service.NlpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

@CrossOrigin(origins = "*")
@RestController
@RequestMapping("/api/note")
public class NoteController {

    private static final Logger logger = Logger.getLogger(NoteController.class.getName());

    // 支持的音频格式白名单
    private static final List<String> SUPPORTED_AUDIO_TYPES = Arrays.asList(
            "audio/wav", "audio/mpeg", "audio/x-wav", "audio/webm", "audio/ogg"
    );

    // 最大文件大小限制：10MB
    private static final long MAX_FILE_SIZE = 10 * 1024 * 1024;

    @Autowired
    @Qualifier("baiduAsrService")
    private AsrService asrService;

    @Autowired
    @Qualifier("deepSeekNlpService")
    private NlpService nlpService;


    *//**
     * 上传音频文件并返回摘要与关键信息
     *//*
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<?> uploadAudio(@RequestParam("file") MultipartFile file) {
        logger.info("收到音频文件上传请求，文件名: " + file.getOriginalFilename());

        // 1. 参数验证
        ResponseEntity<?> validationResult = validateFile(file);
        if (validationResult != null) {
            return validationResult;
        }

        try {
            // 2. 调用语音识别服务
            logger.info("开始语音识别转换...");
            String transcript = asrService.transcribe(file);

            if (transcript == null || transcript.trim().isEmpty()) {
                return ResponseEntity.badRequest().body(
                        Map.of("success", false, "error", "语音识别失败或未能识别出有效内容")
                );
            }

            logger.info("语音识别成功，文本长度: " + transcript.length());

            // 3. 调用 NLP 服务提取摘要与关键点
            logger.info("开始文本摘要提取...");
            Map<String, Object> result = nlpService.extractSummaryAndKeyPoints(transcript);

            // 4. 返回响应结果
            Map<String, Object> response = new HashMap<>();
            response.put("success", true);
            response.put("message", "处理成功");
            response.put("transcript", transcript);
            response.put("summary", result.get("summary"));
            response.put("keyPoints", result.get("keyPoints"));

            logger.info("音频处理完成 ✅");
            return ResponseEntity.ok(response);

        } catch (Exception e) {
            logger.severe("处理音频文件时发生错误: " + e.getMessage());
            e.printStackTrace();

            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(
                    Map.of("success", false, "error", "服务器内部错误: " + e.getMessage())
            );
        }
    }

    *//**
     * 文件验证方法
     *//*
    private ResponseEntity<?> validateFile(MultipartFile file) {
        if (file.isEmpty()) {
            return ResponseEntity.badRequest().body(Map.of("success", false, "error", "文件不能为空"));
        }

        if (file.getSize() > MAX_FILE_SIZE) {
            return ResponseEntity.badRequest().body(Map.of("success", false, "error", "文件大小不能超过10MB"));
        }

        String contentType = file.getContentType();

        // 打印出服务器接收到的 Content Type 和它使用的白名单 (保留日志，方便排查)
        logger.info("文件 Content Type: " + contentType);
        logger.info("服务器支持列表: " + SUPPORTED_AUDIO_TYPES);

        // --- 核心修改开始：处理 Content-Type 额外参数 ---
        String baseContentType = contentType;
        if (contentType != null && contentType.contains(";")) {
            // 提取 Content-Type 的基本部分（例如：从 "audio/webm;codecs=opus" 提取 "audio/webm"）
            baseContentType = contentType.substring(0, contentType.indexOf(";"));
        }

        // 使用提取出的基本类型进行校验
        if (baseContentType == null || !SUPPORTED_AUDIO_TYPES.contains(baseContentType)) {
            return ResponseEntity.badRequest().body(
                    Map.of("success", false, "error", "不支持的音频格式。支持格式: " + SUPPORTED_AUDIO_TYPES)
            );
        }
        // --- 核心修改结束 ---

        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || originalFilename.trim().isEmpty()) {
            return ResponseEntity.badRequest().body(Map.of("success", false, "error", "文件名不能为空"));
        }

        return null; // 验证通过
    }

    *//**
     * 健康检查接口
     *//*
    @GetMapping("/health")
    public ResponseEntity<?> healthCheck() {
        return ResponseEntity.ok(Map.of(
                "status", "UP",
                "service", "AI Note Assistant",
                "timestamp", System.currentTimeMillis()
        ));
    }

    *//**
     * 全局异常捕获
     *//*
    @ExceptionHandler(Exception.class)
    public ResponseEntity<?> handleException(Exception e) {
        logger.severe("捕获到未处理异常: " + e.getMessage());
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(
                Map.of("success", false, "error", "处理请求时发生错误: " + e.getMessage())
        );
    }
}*/

package com.ainote.controller;

import com.ainote.service.AsrService;
import com.ainote.service.NlpService;
import com.ainote.service.impl.BaiduAsrService; // 引入具体的服务实现类，用于调用新增的异步方法
import com.ainote.service.impl.DeepSeekNlpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

@CrossOrigin(origins = "*")
@RestController
@RequestMapping("/api/note")
public class NoteController {

    private static final Logger logger = Logger.getLogger(NoteController.class.getName());

    // 支持的音频格式白名单
    private static final List<String> SUPPORTED_AUDIO_TYPES = Arrays.asList(
            "audio/wav", "audio/mpeg", "audio/x-wav", "audio/webm", "audio/ogg"
    );

    // 最大文件大小限制：10MB
    private static final long MAX_FILE_SIZE = 10 * 1024 * 1024;

    @Autowired
    @Qualifier("baiduAsrService")
    private AsrService asrService;

    @Autowired
    @Qualifier("deepSeekNlpService")
    private NlpService nlpService;


    /**
     * 【重要修改】上传音频文件并改为返回 ASR 任务ID (异步流程)
     */
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<?> uploadAudio(@RequestParam("file") MultipartFile file) {
        logger.info("收到音频文件上传请求，文件名: " + file.getOriginalFilename());

        // 1. 参数验证
        ResponseEntity<?> validationResult = validateFile(file);
        if (validationResult != null) {
            return validationResult;
        }

        try {
            // 2. 将同步调用改为异步任务创建
            logger.info("开始上传文件并创建异步语音识别任务...");

            // 强制转换为具体的服务实现类，以便调用新增的异步方法
            BaiduAsrService baiduAsr = (BaiduAsrService) asrService;

            // 调用新的异步方法，该方法负责: 1. 保存文件; 2. 构造 URL; 3. 调用百度API创建任务
            String taskId = baiduAsr.createAsrTask(file);

            logger.info("异步任务创建成功, taskId: " + taskId);

            // 3. 立即返回任务ID供前端轮询
            Map<String, Object> response = new HashMap<>();
            response.put("success", true);
            response.put("message", "音频文件已上传，正在进行异步识别");
            response.put("taskId", taskId);

            return ResponseEntity.ok(response);

        } catch (Exception e) {
            logger.severe("处理音频文件时发生错误: " + e.getMessage());
            e.printStackTrace();

            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(
                    //Map.of("success", false, "error", "服务器内部错误: " + e.getMessage())
                    // 统一使用 {"status": "error"} 结构来表示错误
                    Map.of("status", "error", "message", "服务器内部错误: " + e.getMessage())
            );
        }
    }

    /**
     * 【统一接口】接收转录文本，调用 NLP 服务提取摘要与关键信息。
     * 前端在轮询 ASR 任务完成后，应调用此接口。
     *
     * @param body 包含 "transcript" 键的Map
     * @return 包含 "summary" 和 "keyPoints" 的JSON响应
     */
    @PostMapping("/analyze")
    public ResponseEntity<?> analyzeTranscript(@RequestBody Map<String, String> body) {
        String transcript = body.get("transcript");

        // 1. 参数校验
        if (transcript == null || transcript.trim().isEmpty()) {
            return ResponseEntity
                    .status(HttpStatus.BAD_REQUEST)
                    .body(Map.of("status", "error", "message", "转录文本不能为空"));
        }

        try {
            logger.info("开始对文本进行 NLP 分析...");

            // 2. 调用 NlpService 的 analyze 方法 (使用您NlpService中定义的最简单的接口)
            // 预期返回 Map<String, String>，包含 {"summary": "...", "keyPoints": "..."}
            Map<String, String> result = nlpService.analyze(transcript);

            // 3. 校验 NLP 服务返回结果
            if (result == null || !result.containsKey("summary") || !result.containsKey("keyPoints")) {
                logger.severe("NLP 服务返回结果为空或格式不正确");
                // 统一返回 500 错误
                return ResponseEntity
                        .status(HttpStatus.INTERNAL_SERVER_ERROR)
                        .body(Map.of("status", "error", "message", "NLP 服务返回结果格式错误或分析失败"));
            }

            logger.info("文本分析完成 ✅");

            // 4. 成功响应
            // 返回一个统一的成功结构，将结果放在 data 字段中。
            Map<String, Object> response = new HashMap<>();
            response.put("status", "success");
            response.put("message", "文本分析成功");
            response.put("data", result);

            return ResponseEntity.ok(response);

        } catch (Exception e) {
            logger.severe("处理文本分析时发生错误: " + e.getMessage());
            e.printStackTrace();
            return ResponseEntity
                    .status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(Map.of("status", "error", "message", "文本分析失败: " + e.getMessage()));
        }
    }

    /**
     * 文件验证方法 (保持不变)
     */
    private ResponseEntity<?> validateFile(MultipartFile file) {
        if (file.isEmpty()) {
            return ResponseEntity.badRequest().body(Map.of("success", false, "error", "文件不能为空"));
        }

        if (file.getSize() > MAX_FILE_SIZE) {
            return ResponseEntity.badRequest().body(Map.of("success", false, "error", "文件大小不能超过10MB"));
        }

        String contentType = file.getContentType();

        // 打印出服务器接收到的 Content Type 和它使用的白名单 (保留日志，方便排查)
        logger.info("文件 Content Type: " + contentType);
        logger.info("服务器支持列表: " + SUPPORTED_AUDIO_TYPES);

        // --- 核心修改开始：处理 Content-Type 额外参数 ---
        String baseContentType = contentType;
        if (contentType != null && contentType.contains(";")) {
            // 提取 Content-Type 的基本部分（例如：从 "audio/webm;codecs=opus" 提取 "audio/webm"）
            baseContentType = contentType.substring(0, contentType.indexOf(";"));
        }

        // 使用提取出的基本类型进行校验
        if (baseContentType == null || !SUPPORTED_AUDIO_TYPES.contains(baseContentType)) {
            return ResponseEntity.badRequest().body(
                    Map.of("success", false, "error", "不支持的音频格式。支持格式: " + SUPPORTED_AUDIO_TYPES)
            );
        }
        // --- 核心修改结束 ---

        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || originalFilename.trim().isEmpty()) {
            return ResponseEntity.badRequest().body(Map.of("success", false, "error", "文件名不能为空"));
        }

        return null; // 验证通过
    }

    /**
     * 健康检查接口
     */
    @GetMapping("/health")
    public ResponseEntity<?> healthCheck() {
        return ResponseEntity.ok(Map.of(
                "status", "UP",
                "service", "AI Note Assistant",
                "timestamp", System.currentTimeMillis()
        ));
    }

    /**
     * 全局异常捕获
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<?> handleException(Exception e) {
        logger.severe("捕获到未处理异常: " + e.getMessage());
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(
                //Map.of("success", false, "error", "处理请求时发生错误: " + e.getMessage())
                Map.of("status", "error", "message", "处理请求时发生错误: " + e.getMessage())
        );
    }

    @GetMapping("/test-deepseek-key")
    public ResponseEntity<String> testDeepseekKey() {
        // 强制转换为具体的服务实现类，以便调用新增的异步方法
        DeepSeekNlpService deepseekNlpService = (DeepSeekNlpService) nlpService;
        String result = deepseekNlpService.testApiKey();
        if (result.startsWith("SUCCESS")) {
            return ResponseEntity.ok(result);
        } else {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
        }
    }
}